home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 26 / Cream of the Crop 26.iso / program / p063b9s.zip / UNIT / PARSEREQ.PAS < prev    next >
Pascal/Delphi Source File  |  1997-03-02  |  9KB  |  317 lines

  1. UNIT ParseReq;
  2. {╔══════════════════════════════════════════════════════════════════════════╗}
  3. {║ Statemachine to handle file requests          Last changed: 02.03.97  SA ║}
  4. {║                                                                          ║}
  5. {║                         (C) Copyright 1989-97 by                         ║}
  6. {║       Dan Wulff, Jens Sandalgaard, Steen Christensen & S¢ren Ager        ║}
  7. {║                                                                          ║}
  8. {║ This source may not be given to anybody, without the written permission  ║}
  9. {║ from The Portal Team.                                                    ║}
  10. {╚══════════════════════════════════════════════════════════════════════════╝}
  11. {$I POPDEFS.INC}
  12.  
  13. INTERFACE
  14.  
  15. USES Use32, Dos,
  16.      PoPTypes, NetFile;
  17.  
  18. TYPE
  19.   ReqTmpVarType=RECORD
  20.     Found : Boolean;
  21.     NextState : Byte;
  22.     ReqTime,
  23.     OKName, ReqName : S20;
  24.     ReqPwd : S80;
  25.     RawReqName, Nfts,
  26.     ReqLine, ReqFileName : PathStr;
  27.     ReqFile, OkFile : TNetFile;
  28.   END;
  29.  
  30. VAR
  31.   ReqFilesOpen  : Boolean;
  32.   TempSr, ReqSr : SearchRec;
  33.  
  34. FUNCTION  InitReqFile(Net, Node: Integer): Boolean;
  35. FUNCTION  GetNextFileToSend(VAR FreeArea: TFreeArea): PathStr;
  36. PROCEDURE CloseReqFiles;
  37.  
  38. IMPLEMENTATION
  39.  
  40. USES OpCrt, OpDate, OpDos, OpString,
  41.      Globals, Com, FileUtil, UnixDate, MailUtil, StrUtil, PTpl, LogFile,
  42.      Util;
  43.  
  44. CONST
  45.   Rt : ^ReqTmpVarType = NIL;
  46.  
  47. FUNCTION InitReqFile(Net, Node: Integer): Boolean;
  48. BEGIN
  49.   New(Rt);
  50.   ReqFilesOpen:=False;
  51.   InitReqFile:=False;
  52.   Rt^.Found:=False;
  53.   RspFile:=HoldFileName(Call,True)+'RSP';
  54.  
  55.   Rt^.ReqFileName:=MakeReqFileName(Net, Node, GlobNodeStat);
  56.   IF NOT Rt^.ReqFile.OpenWithMode(Rt^.ReqFileName, 1, False, ShareRW+ShareDenyW) THEN
  57.   BEGIN
  58.     CloseReqFiles;
  59.     Exit;
  60.   END;
  61.   IF NOT Rt^.OkFile.Open(StartPath+PoPOkFileName,SizeOf(TOkFile),False) THEN
  62.   BEGIN
  63.     AddLog('!','Can''t open PORTAL.OKF');
  64.     CloseReqFiles;
  65.     Exit;
  66.   END;
  67.   ReqFilesOpen:=True;
  68.   AddLog(' ','NodeStat: '+Long2Str(Ord(GlobNodeStat))+' = Files: '+Long2Str(MaxReqFiles)+
  69.              '  Bytes: '+Long2Str(MaxReqBytes)+
  70.              '  Time: '+TimeToTimeString('hh:mm:ss',MaxReqTime));
  71.   Rt^.NextState:=1;
  72.   InitReqFile:=TRUE;
  73.   StartTime:=CurrentTime;
  74. END;
  75.  
  76. FUNCTION GetNextFileToSend(VAR FreeArea: TFreeArea): PathStr;
  77. VAR
  78.   OkFileRec : TOkFile;
  79.  
  80.   PROCEDURE ReadNextReqLine;
  81.   VAR
  82.     s:String;
  83.     i,p:BYTE;
  84.     ch:char;
  85.   BEGIN
  86.     Rt^.OkFile.Seek(0);
  87.     Rt^.Found:=False;
  88.     REPEAT
  89.       Rt^.ReqFile.ReadLine(Rt^.ReqLine) ;
  90.     UNTIL Rt^.ReqFile.EoF OR ((Rt^.ReqLine<>'') AND (Copy(Rt^.ReqLine,1,1)<>';'));
  91.     IF Rt^.ReqFile.EoF AND (Rt^.ReqLine='') THEN
  92.     BEGIN
  93.       Rt^.NextState:=5;
  94.       Exit;
  95.     END;
  96.     Rt^.ReqLine:=StUpCase(Rt^.ReqLine);
  97.     Rt^.ReqName:='';
  98.     Rt^.ReqPwd:='';
  99.     Rt^.ReqTime:='';
  100.     FOR i:=1 TO WordCount(Rt^.reqline, [' ']) DO
  101.     BEGIN
  102.       s:=ExtractWord(i, Rt^.reqline, [' ']);
  103.       Ch:=s[1];
  104.       IF i>1 THEN
  105.       BEGIN
  106.         CASE Ch OF
  107.           '!' : Rt^.reqpwd:=Copy(s, 2, 255);
  108.           '+' : Rt^.reqtime:=Copy(s, 2, 255);
  109.         END;
  110.       END ELSE
  111.         IF Ch<>#0 THEN Rt^.ReqName:=s;
  112.     END;
  113.     IF Rt^.ReqName='' THEN Exit;
  114.     JustFileName(CleanPathName(Trim(Rt^.reqname)));
  115.     Rt^.rawreqname:=Rt^.reqname;
  116.     AddLog('+', 'File Request: `'+Rt^.rawreqname+'''');
  117.     IF Rt^.NextState<>5 THEN
  118.     BEGIN
  119.       Rt^.NextState:=2;
  120.       p:=pos('.', Rt^.reqname);
  121.       IF p>0 THEN
  122.       BEGIN
  123.         Rt^.reqname:=CPad(Copy(Rt^.ReqName,1,p-1), 8)+Pad(Copy(Rt^.reqname, p, 4),4);
  124.         p:=pos('*', Rt^.reqname);
  125.         IF p IN [1..8] THEN
  126.           FOR i:=p TO 8 DO
  127.             Rt^.reqname[i]:='?';
  128.         p:=pos('*', Rt^.reqname);
  129.         IF p > 9 THEN
  130.           FOR i:=p TO 12 DO
  131.             Rt^.reqname[i]:='?';
  132.       END ELSE
  133.         Rt^.ReqName:=CPad(Rt^.ReqName,8)+'.   ';
  134. {
  135. AddLog('*', 'CONVERTED REQ NAME: "'+ReqName+'"');
  136. }
  137.     END;
  138.   END;
  139.  
  140.   PROCEDURE ReadNextOkLine;
  141.   VAR
  142.     i,p : Byte;
  143.   BEGIN
  144.     Rt^.OkFile.Read(OkFileRec, NoKeep, Wait);
  145.     IF Rt^.OkFile.IoResult<>0 THEN
  146.     BEGIN
  147.       Rt^.NextState:=1;
  148.       IF NOT Rt^.Found THEN
  149.       BEGIN
  150.         ReqSr.Name:=Rt^.rawreqname;
  151.         ReqSr.size:=0;
  152.         ReqSr.Time:=0;
  153.         AddTpl(rspfile,'NOTFOUND', ReqSr);
  154.         AddLog('#','Requested file not found: '+Rt^.RawReqName);
  155.       END;
  156.       Exit;
  157.     END ELSE
  158.     BEGIN
  159.       Rt^.NextState:=3;
  160.       FreeArea:=OkFileRec.FreeArea;
  161.     END;
  162.     IF ((OkFileRec.Password<>'') AND (OkFileRec.Password<>Rt^.reqpwd)) OR (OkFileRec.NodeStat>GlobNodeStat) OR
  163.        (OkFileRec.Level>NodesRec.Level) OR
  164.        ((NodesRec.Keys AND OkFileRec.Keys)<>OkFileRec.Keys) OR
  165.        ((OkFileRec.TaskNumber<>0) AND (OkFileRec.TaskNumber<>Cfg.TaskNumber)) THEN
  166.     BEGIN
  167.       Rt^.NextState:=2;
  168.       Exit;
  169.     END;
  170.     Rt^.OKName:='';
  171.     IF OkFileRec.MagicName='' THEN
  172.     BEGIN
  173.       { normal f.req. }
  174.       okpath:=OkFileRec.FilePath;
  175.       Rt^.OKName:=JustFileName(okpath);
  176.       okpath[0]:=Chr(Length(okpath)-Length(Rt^.OKName)-1);
  177. {
  178.       IF NOT chkdir(okpath) THEN
  179.       BEGIN
  180.         AddLog('!', 'OKFile error: "'+okpath+'" does not exist');
  181.         NextState:=2;
  182.         Exit;
  183.       END;
  184. }
  185.       p:=pos('.', Rt^.OKName);
  186.       IF p=0 THEN
  187.         Rt^.OKName:=CPad(Rt^.OKName,8)+'.   '
  188.       ELSE
  189.         Rt^.OKName:=Pad(Copy(Rt^.OKName, 1, p-1),8)+Pad(Copy(Rt^.OKName, p, 4),4);
  190.       p:=pos('*', Rt^.OKName);
  191.       IF p IN [1..8] THEN
  192.         FOR i:=p TO 8 DO
  193.           Rt^.OKName[i]:='?';
  194.       p:=pos('*', Rt^.OKName);
  195.       IF p > 9 THEN
  196.         FOR i:=p TO 12 DO
  197.           Rt^.OKName[i]:='?';
  198.       FOR i:=1 TO 12 DO
  199.         IF (Rt^.reqname[i]<>'?') AND (Rt^.OKName[i]='?') THEN Rt^.OKName[i]:=Rt^.reqname[i];
  200.     END ELSE
  201.     BEGIN
  202.       { Magic filename }
  203.       IF StUpCase(OkFileRec.MagicName)=StUpCase(Rt^.RawReqName) THEN
  204.       BEGIN
  205.         okpath:=OkFileRec.FilePath;
  206.         Rt^.OKName:=JustFileName(okpath);
  207.         okpath[0]:=Chr(Length(okpath)-Length(Rt^.OKName)-1);
  208.       END ELSE
  209.         Rt^.NextState:=2;
  210.     END;
  211.     Replace(Rt^.OKName, ' ', '', 0);
  212.   END;
  213.  
  214.   PROCEDURE FindFirstFileToSend;
  215.   VAR
  216.     dt:DateTime;
  217.     reqtimenum,u:LongInt;
  218.     test:WORD;
  219.  
  220.     FUNCTION HaveJoker(CONST FName: PathStr): Boolean;
  221.     BEGIN
  222.       HaveJoker:=(Pos('*', FName)>0) OR (Pos('?',FName)>0);
  223.     END;
  224.  
  225.   BEGIN
  226.     FindFirst(OkPath+'\'+Rt^.OKName, Archive+ReadOnly, ReqSr);
  227.     IF DosError<>0 THEN
  228.     BEGIN
  229.       Rt^.NextState:=2;
  230.       IF DOSError=3 THEN AddLog('!', 'OKFile error: "'+okpath+'" does not exist');
  231.     END ELSE
  232.     BEGIN
  233.       Rt^.NextState:=4;
  234. {        IF NOT HaveJoker(RawReqName) AND
  235.            ((OkFileRec.MagicName='') OR NOT HaveJoker(OkFileRec.FilePath)) THEN
  236.           NextState:=1;}
  237.       IF Cfg.Request.SkipAfterFirst THEN
  238.         IF NOT HaveJoker(Rt^.RawReqName) AND (OkFileRec.MagicName='') THEN Rt^.NextState:=1;
  239.       IF Rt^.ReqTime<>'' THEN
  240.       BEGIN
  241.         UnPackTime(ReqSr.Time, Dt);
  242.         WITH Dt DO
  243.           u:=GetUnixDate(Year, Month, Day, Hour, Min, Sec);
  244.         Val(Rt^.reqtime, reqtimenum, test);
  245.       END;
  246.       IF (Rt^.ReqTime='') OR ((Rt^.ReqTime<>'') AND (reqtimenum<u)) THEN
  247.       BEGIN
  248.         Rt^.Nfts:=OkPath+'\'+ReqSr.Name;
  249.         Rt^.Found:=True;
  250.       END;
  251.     END;
  252.   END;
  253.  
  254.   PROCEDURE FindNextFileToSend;
  255.   VAR
  256.     dt:DateTime;
  257.     reqtimenum,u:LongInt;
  258.     test:WORD;
  259.   BEGIN
  260.     FindNext(ReqSr);
  261.     IF DosError<>0 THEN Rt^.NextState:=2 ELSE
  262.     BEGIN
  263.       Rt^.NextState:=4;
  264.       IF Rt^.reqtime <> '' THEN
  265.       BEGIN
  266.         UnPackTime(ReqSr.Time, Dt);
  267.         WITH Dt DO
  268.           u:=GetUnixDate(Year, Month, Day, Hour, Min, Sec);
  269.         Val(Rt^.reqtime, reqtimenum, test);
  270.       END;
  271.       IF (Rt^.reqtime='') OR ((Rt^.ReqTime<>'') AND (ReqTimeNum<u)) THEN
  272.       BEGIN
  273.         Rt^.Nfts:=OkPath+'\'+ReqSr.Name;
  274.         Rt^.Found:=True;
  275.       END;
  276.     END;
  277.   END;
  278.  
  279. BEGIN
  280.   Rt^.nfts:='';
  281.   doserror:=0;
  282.   IF ExistFile(Rt^.ReqFileName) THEN
  283.   BEGIN
  284.     REPEAT
  285.       CASE Rt^.NextState OF
  286.         1 : ReadNextReqLine;
  287.         2 : ReadNextOkLine;
  288.         3 : FindFirstFileToSend;
  289.         4 : FindNextFileToSend;
  290.       END;
  291.     UNTIL (Rt^.NextState=5) OR (Rt^.nfts<>'') OR NOT ComPort^.Carrier;
  292.   END;
  293.   GetNextFileToSend:=Rt^.nfts;
  294.   IF (Rt^.nfts='') OR NOT ComPort^.Carrier THEN CloseReqFiles;
  295. END;
  296.  
  297.   PROCEDURE CloseReqFiles;
  298.   BEGIN
  299.     FindClose(ReqSr);
  300.     IF ReqFilesOpen THEN
  301.     BEGIN
  302.       Rt^.ReqFile.Close;
  303.       DeleteFile(Rt^.ReqFileName);
  304.       Rt^.OkFile.Close;
  305.       ReqFilesOpen:=False;
  306.     END;
  307.     IF Rt<>NIL THEN
  308.     BEGIN
  309.       Dispose(Rt);
  310.       Rt:=NIL;
  311.     END;
  312.   END;
  313.  
  314. BEGIN
  315.   ReqFilesOpen:=False;
  316. END.
  317.